M'en fou pas lu
- Tu clones ca
- Tu suis les instructions d'installation
- Tu profites
Pourquoi utiliser devenv
Devenv permet de faciliter la mise en place d'environnement de développement. Il utilise le package manager de nix pour faire en sorte que chaque environnement de développement soit isolé tout en restant performant car tout tourne sur la machine hôte.
Et pourquoi pas docker compose ?
- Pas de possibilité de comprendre en un seul fichier toutes les dépendances de l'environnement de développement
- Pas de possibilité de garder ses préférences de terminal (.bashrc), d'utiliser ses outils préférés en cli si besoin (vim, tmux, etc)
- Il faut gérer les volumes pour savoir ce à quoi on veut avoir accés pendant le développement
- Probléme de lenteur avec next.js
- Probléme d'usage de RAM avec mac (Besoin d'une machne virtuelle faisant tourner des container)
- Compliqué de faire tourner les linter dans les hook git étant donné que le runtime est dans le container alors que la commande git est lancée sur la machine hôte
Installation
Nix package manager
La première chose à faire est d'installer le package manager nix. Le mieux est d'utiliser le determinate installer.
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
Il faut voir cet outil comme une sorte d'apt compatible avec tous les systèmes d'exploitation Linux et MacOS.
Installation de devenv
nix profile install --accept-flake-config nixpkgs#devenv
le flag --accept-flake-config est lié au fait que la notion de flakes dans nix n'est pas encore considérée comme stable, même si la communauté nix l'utilise déjà en majorité.
Vérification de l'installation
en lançant la commande suivante, vous devriez voir la version de devenv
devenv version
Configuration
Initialisation
Si vous voulez juste un env de dev ITN "classique"
https://github.com/ITNetworkParis/skeleton
Si vous souhaitez configurer un environnement de zero
cd <votre-nouveau-super-projet>
devenv init
Fichiers de configuration
Vous aves 4 fichiers de configuration créé
- .envrc => fichier de configuration de direnv (j'en parle plus bas)
- devenv.nix => c'est dans ce fichier que vous allez décrire votre environnement de développement
- devenv.yaml => c'est les valeurs d'entrée de votre environnement de développement, normalement vous n'avez pas besoin de le modifier
- devenv.lock => c'est le fichier qui s'assure sue tout le monde utilise la même version des dépendances (équivaut à un yarn.lock ou un composer.lock)
devenv.nix
le guide décrit assez bien comment configurer les différents éléments. Concrétement vous allez avoir besoin de trois éléments principaux
Languages
Ce sont les différents runtime à installer. Par exemple, si vous avez besoin de nodejs 20, vous allez devoir ajouter la ligne suivante dans votre devenv.nix
languages = {
javascript = {
enable = true;
package = pkgs.nodejs_20;
};
};
Services
Ce sont les services que vous allez devoir lancer pour que votre environnement de développement fonctionne. Par exemple, si vous avez besoin de postgresql 16, vous allez devoir ajouter la ligne suivante dans votre devenv.nix
services = {
postgresql = {
enable = true;
package = pkgs.postgresql_16;
};
};
Processes
Ce sont les processus que vous allez devoir lancer pour que votre environnement de développement fonctionne. Par exemple, si vous avez besoin de lancer votre démon next.js, vous allez devoir ajouter la ligne suivante dans votre devenv.nix
processes = {
nextjs.exec = "cd front && npm run dev";
};
Il est possible de définir des dépendances avec des services, par exemple si vous avez besoin de lancer un worker qui dépend de postgresql et rabbitmq, vous pouvez ajouter la ligne suivante dans votre devenv.nix
processes = {
my-worker = {
exec = "bin/console swarrot:consume:my-worker";
depends_on.rabbitmq.condition = "process_healthy";
depends_on.postgres.condition = "process_healthy";
};
};
Les autres config intéresantes mais moins importantes
Hooks git
scripts
Utilisation
Activation de l'environnement de développement
Normalement pas nécessaire si direnv est installé
devenv shell
Lancement des services et des processus (utilise compose)
devenv up
petits tips intéressants sur process-compose
- CTRL + R sur un service/processus pour le redémarrer
- CTRL + C pour arrêter le service/processus
- CTRL + S pour activer la sélection de texte (Xorg uniquement: pas de support wayland)
direnv (optionnel)
Si vous voulez que votre environnement de développement soit activé automatiquement à chaque fois que vous entrez dans le dossier de votre projet, vous pouvez utiliser direnv.
nix profile install --accept-flake-config nixpkgs#direnv
ajouter à la fin de votre fichier .bashrc
eval "$(direnv hook bash)"
il faudra penser à relancer votre terminal pour que les changements soient pris en compte
il faut utiliser la commande direnv allow pour autoriser l'exécution du fichier .envrc la première fois que vous entrez dans le dossier de votre projet (c'est une sécurité de direnv)
Astuces
Surcharger le fichier de configuration
Vous pouvez surcharger la configuration avec un fichier de configuration spécifique(sur le même principe que le docker-compose.override.yml de docker) en créant un fichier devenv.local.nix
Désactiver un service
Par exemple pour les personnes souhaitant garder la base de donnée installée via APT
services.postgres.enable = lib.mkForce false;
Désactiver un processus
Si on ne veut pas lancer certains worker rabbitmq
processes.mailer_processor.process-compose.disabled = true;
mailer_processor est le nom du process défini dans devenv.nix
Chercher un paquet
Avec devenv
La recherche devenv permet à la fois de chercher dans les options de devenv mais aussi dans les paquets nix disponibles
devenv search php
Avec nix search
https://search.nixos.org/packages
Pour installer un paquet une fois que l'on connait son nom, se référer à la section suivante de la documentation
Installer un paquet a une version spécifique
Nixhub est un moteur de recherche alternatif pour les paquets nix. Il a l'avantage de donner la possibilité de connaitre toutes les versions disponibles d'un paquet. C'est un outil fourni par jetify, créateur d'une alternative à devenv nommé devbox.
Par exemple si vous voulez installer bat (une alternative en rust à cat à la version 0.20), vous pouvez aller sur la page nixhub de bat pour voir toutes les versions disponibles. Pour installer la versions que l'on veut, il faut récupérer le hash du commit Nixpkgs (nixpkgs/4d38122a19cc3c415baf04b99906c8caa828a5fc dans notre cas) et ajouter la ligne suivante dans votre devenv.yaml
inputs:
# We want update on process-compose for new features (clean and mark logs)
nix-bat_0_22_0:
url: github:NixOS/nixpkgs?rev=4d38122a19cc3c415baf04b99906c8caa828a5fc
puis dans le fichier devenv.nix
{ pkgs, lib, config, inputs, ... }:
let
nix-bat_0_22_0 = import nix-bat_0_22_0 { inherit (pkgs) system; };
in
{
packages = [
nix-bat_0_22_0.bat
]
# ...
}
Voir les exemples de configuration
Beaucoup d'exemples de configuration sont disponibles sur le github de devenv
Mettre à jour devenv
nix profile upgrade --accept-flake-config devenv